package registnet.base;

import java.util.List;

/**
 * Defines an interface for transcript of records implementations.
 */
public interface ITranscript {

	/**
	 * Returns the student number of the student associated with the transcript.
	 * @return the student number of the student associated with the transcript
	 */
	public String getStudentNumber();
	
	/**
	 * Sets the student number of student to be associated with the transcript.
	 * @param studentNumber - the student number of student to be associated with the transcript
	 */
	public void setStudentNumber(String studentNumber);
	
	/**
	 * Returns the curriculum of the student associated with the transcript
	 * @return
	 */
	public ICurriculum getCurriculum();
	
	/**
	 * Sets the curriculum of the student to be associated with the transcript.
	 * @param curriculum - the curriculum of the student to be associated with the transcript
	 */
	public void setCurriculum(ICurriculum curriculum);
	
	/**
	 * Adds a course to the list of courses associated with the transcript.
	 * @param course - the course to be added to the list of courses associated with the transcript
	 */
	public void addCourse(ICourse course);
	
	/**
	 * Returns a list of all courses taken by the student which is equivalent to 
	 * the list of courses associated with the transcript
	 * @return a list of all courses taken by the student
	 */
	public List<ICourse> getAllCoursesTaken();
	
	/**
	 * Returns a list of all courses taken by the student for the given year and semester.
	 * @param year
	 * @param semester
	 * @return a list of all courses taken by the student for the given year and semester
	 */
	public List<ICourse> getCoursesTaken(int year, int semester);
	
	/**
	 * Returns a list of all courses taken by the student for the given year.
	 * @param year
	 * @return a list of all courses taken by the student for the given year
	 */
	public List<ICourse> getCoursesTaken(int year);
	
	/**
	 * Returns the most recent <code>CourseTaken</code> given a courseCode.
	 * @param courseCode
	 * @return the most recent <code>CourseTaken</code> given a courseCode
	 */
	public ICourse getRecentCourseTaken(String courseCode);
	
	/**
	 * Checks if a <code>CourseTaken</code> with the given courseCode is included in the list of
	 * courses associated with the transcript.
	 * @param courseCode
	 * @return <code>true</code> if a <code>CourseTaken</code> with the given courseCode 
	 * is included in the list of courses associated with the transcript
	 * and <code>false</code> otherwise. 
	 */
	public boolean contains(String courseCode);
	
	/**
	 * Checks if a <code>CourseTaken</code> equivalent to the given <code>ICourse</code> is included 
	 * in the list of courses associated with the transcript.
	 * @param course
	 * @return <code>true</code> if a <code>CourseTaken</code> equivalent to the given <code>ICourse</code> 
	 * is included in the list of courses associated with the transcript
	 * and <code>false</code> otherwise.
	 */
	public boolean contains(ICourse course);
	
	/**
	 * Returns the current total units credited to the student based on his/her curriculum.
	 * @return the current total units credited to the student based on his/her curriculum
	 */
	public int getUnitsCredited();
	
	/**
	 * Returns the current GWA of the student.
	 * @return the current GWA of the student
	 */
	public double getGWA();
	
	/**
	 * Checks if a course with the given courseCode is already completed/passed/satisfied.
	 * @param courseCode
	 * @return <code>true</code> a course with the given courseCode is already completed/passed/satisfied
	 * and <code>false</code> otherwise.
	 */
	public boolean isCompleted(String courseCode);
	
	/**
	 * Returns the total units credited to the student based on his/her curriculum for the given year and semester. 
	 * @param year
	 * @param semester
	 * @return the total units credited to the student based on his/her curriculum for the given year and semester
	 */
	public int getUnitsCredited(int year, int semester);
	
}
